home *** CD-ROM | disk | FTP | other *** search
/ MASPC 1 / MASPC_1.iso / Demos / Demo DIV / DATA / PRG / JUEGOS / STEROID.PRG < prev   
Encoding:
Text File  |  1997-11-28  |  13.8 KB  |  369 lines

  1.  
  2. //-----------------------------------------------------------------------------
  3. //TITULO:        STEROID
  4. //AUTOR:         DANIEL NAVARRO
  5. //FECHA:         10-5-96
  6. //-----------------------------------------------------------------------------
  7.  
  8. PROGRAM steroid;
  9.  
  10. GLOBAL
  11.     puntuacion=0;               // Puntuación
  12.     vidas=3;                    // Vidas restantes
  13.     vida[2];                    // Identificadores del gráfico de las vidas
  14.     muerte=0;                   // Indica si ha muerto o no (Bandera)
  15.     nivel=1;                    // Numero de Fase
  16.     salir_=0;                   // Bandera de salida (1=Salir del juego)
  17.  
  18.     sonido_fuego;               // Identificadores de sonidos
  19.     sonido_explosion;
  20.     sonido_aceleracion;
  21.     sonido_hiperespacio;
  22.  
  23.     volumen=0;                  // Volumen del sonido de aceleración
  24.     id_sonido;                  // Identificador del sonido de aceleración
  25.  
  26. PRIVATE
  27.     contador0=0;                // Contador de uso general
  28.     id2;                        // Identificador de uso general
  29. BEGIN
  30.  
  31.     // Selecciona modo gráfico y carga de ficheros
  32.     set_mode(m640x480);
  33.     load_fpg("steroid\steroid.fpg");
  34.     load_fnt("steroid\steroid.fnt");
  35.  
  36.     // Carga los sonidos necesarios
  37.     sonido_fuego=load_pcm("steroid\tubo8.pcm",0);
  38.     sonido_explosion=load_pcm("steroid\tubo5.pcm",0);
  39.     sonido_aceleracion=load_pcm("steroid\nave.pcm",1);
  40.     sonido_hiperespacio=load_pcm("steroid\fx33.pcm",0);
  41.  
  42.     // Crea las estrellas del fondo de la pantalla
  43.     FROM contador0=0 TO 499;
  44.         put_pixel(rand(0,639),rand(0,479),127);
  45.     END
  46.  
  47.     // Escribe los textos de presentación
  48.     write(1,320,0,1,"STEROIDS Version 1.0");
  49.     write(1,320,15,1,"(c) DIV GAMES STUDIO");
  50.     write(1,0,480,6,"LEVEL");
  51.     write(1,640,480,8,"< >:rotar ^:avanzar SPC:disparo H:hiperespacio");
  52.     write_int(1,640,0,2,&puntuacion);
  53.     write_int(1,64,480,6,&nivel);
  54.  
  55.     // Inicia el sonido del motor de la nave
  56.     id_sonido=sound(sonido_aceleracion,volumen,200);
  57.  
  58.     LOOP                                          // Bucle principal
  59.         fade_on();                                // Apaga pantalla
  60.         puntuacion=0;                             // Inicia variables necesarias
  61.         nivel=1;                                  // Puntuación, Fase, Vidas, Volumen
  62.         vidas=3;
  63.         volumen=0;
  64.         // Pone un texto explicativo
  65.         id2=write(1,320,240,1,"PRESIONE UNA TECLA PARA JUGAR");
  66.  
  67.         scan_code=0;
  68.         REPEAT                              // Repite hasta que se suelte cualquier tecla
  69.             FRAME;
  70.         UNTIL (scan_code==0)
  71.  
  72.         REPEAT
  73.             IF (key (_esc))                 // Si se pulsa ESCAPE
  74.                 fade_off();                 // Apaga la pantalla
  75.                 salir_=1;
  76.             END
  77.             FRAME;
  78.         UNTIL (scan_code<>0 OR (salir_==1))     // Si pulsas una tecla, empieza el juego
  79.  
  80.         IF (salir_==1)
  81.             let_me_alone();             // Elimina todos los demás procesos
  82.             BREAK;                      // Sale del bucle
  83.         ELSE
  84.             salir_=0;
  85.         END              // Si se pulso escape, sale del juego
  86.         delete_text(id2);
  87.  
  88.         nave(320,240);                          // Inicia la nave
  89.  
  90.         // Inicia los asteroides, crea los procesos tipo asteroide
  91.         FOR (contador0=0;contador0<2+nivel;contador0++)
  92.             asteroide(-16,-16,3);
  93.         END
  94.  
  95.         // Inicia los gráficos de las vidas
  96.         vida[0]=nave_pequeña(16,16);
  97.         vida[1]=nave_pequeña(48,16);
  98.         vida[2]=nave_pequeña(80,16);
  99.         LOOP
  100.             // Si se pulsa [ESCAPE] se sale del juego
  101.             IF (key(_esc))
  102.                 vidas=0;
  103.                 let_me_alone();
  104.                 fade_off();
  105.                 BREAK;
  106.             END
  107.  
  108.             IF (muerte)                             // Si te matan
  109.                 signal(vida[--vidas],s_kill);       // Se borra un gráfico de las vidas
  110.                 signal(TYPE asteroide,s_kill);      // También los asteroides
  111.                 signal(TYPE disparo_nave,s_kill);   // Y los disparos
  112.                 muerte=0;
  113.  
  114.                 IF (vidas==0)                       // Si no tienes vidas
  115.                     fade_off();                     // Acaba el juego
  116.                     let_me_alone();
  117.                     BREAK;
  118.                 END
  119.                 fade(0,0,0,8);                      // Hace apagado de pantalla
  120.                 WHILE (fading)                      // De un modo especial
  121.                     FRAME;
  122.                 END
  123.  
  124.                 nave(320,240);                      // Crea nave protagonista
  125.                 FOR (contador0=0;contador0<2+nivel;contador0++)             // Crea los asteroides
  126.                     asteroide(-16,-16,3);           // Dependiendo de la fase
  127.                 END
  128.  
  129.                 fade(100,100,100,8);                // Enciende la pantalla
  130.             END
  131.  
  132.             IF (get_id(TYPE asteroide)==0)          // Si no quedan asteroides
  133.                 fade(0,0,0,8);                      // Apaga pantalla
  134.                 WHILE (fading)                      // Espera
  135.                     FRAME;
  136.                 END
  137.                 nivel++;                            // Cambia de nivel
  138.                 WHILE (id2=get_id(TYPE disparo_nave))   // Elimina los disparos actuales
  139.                     signal(id2,s_kill);
  140.                 END
  141.                 signal(get_id(TYPE nave),s_kill);   // Elimina la nave
  142.                 nave(320,240);                      // Crea una nueva nave
  143.                 FOR (contador0=0;contador0<2+nivel;contador0++) // Crea nuevos asteroides
  144.                     asteroide(-16,-16,3);
  145.                 END
  146.                 fade(100,100,100,8);                // Enciende la pantalla
  147.             END
  148.  
  149.             FRAME;
  150.             change_sound(id_sonido,volumen,200);    // Actualiza el sonido del motor
  151.         END
  152.     END
  153.     fade_off(); // Apaga la pantalla antes de salir del programa
  154. END
  155. //-----------------------------------------------------------------------------
  156. // Proceso para controlar el objeto nave
  157. // Entradas: Coordenadas de la nave
  158. //-----------------------------------------------------------------------------
  159. PROCESS nave(x,y);
  160.  
  161. PRIVATE
  162.     disparo=1;              // 1=disparo permitido, 0=no permitido
  163.     hiper=1;                // 1=hiperespacio permitido, 0=no permitido
  164.     velocidad_x=0;          // incremento x
  165.     velocidad_y=0;          // incremento y
  166.  
  167. BEGIN
  168.     graph=1;
  169.     LOOP
  170.         // Lee teclas y actualiza el ángulo de la nave
  171.         IF (key(_right)) angle-=pi/16; END
  172.         IF (key(_left)) angle+=pi/16; END
  173.  
  174.         IF (key(_up))                       // Calcula el avance con formula
  175.             velocidad_x+=get_distx(angle,10);
  176.             velocidad_y+=get_disty(angle,10);
  177.             // Incrementa el volumen de la nave
  178.             IF ((volumen+=30) > 256) volumen=256; END
  179.         ELSE
  180.             // Decrementa el volumen
  181.             volumen-=10;
  182.             IF (volumen<0) volumen=0; END
  183.         END
  184.  
  185.         x+=velocidad_x/10;
  186.         y+=velocidad_y/10;
  187.  
  188.         // Comprueba si se ha salido de la pantalla y lo soluciona
  189.         IF (x<-16) x+=640+32; END
  190.         IF (y<-16)  y+=480+32; END
  191.         IF (x>640+16) x-=640+32; END
  192.         IF (y>480+16) y-=480+32; END
  193.  
  194.         IF (key(_space) OR key (_control))      // Comprueba la tecla de disparo
  195.             IF (disparo)                        // Y si se puede dispara
  196.                 disparo=0;
  197.                 disparo_nave(x,y,angle);        // Dispara, creando un proceso tipo disparo nave
  198.             END
  199.         ELSE
  200.             disparo=1;                          // Hace que los disparos salgan de uno en uno
  201.         END
  202.  
  203.         IF (key(_h))                            // Comprueba la tecla del hiperespacio
  204.             IF (hiper)                          // Y si se puede se hace
  205.                 hiper=0;
  206.                 hiperespacio(x,y);
  207.                 x=rand(0,640);                  // Pon la nave en una posición aleatoria
  208.                 y=rand(0,480);
  209.             END
  210.         ELSE
  211.             hiper=1;                            // Hace que los hiperespacios salgan de uno en uno
  212.         END
  213.  
  214.         FRAME;
  215.     END
  216. END
  217.  
  218. //-----------------------------------------------------------------------------
  219. // Proceso para manejar los disparos de la nave
  220. // Entradas: Coordenadas de la nave y ángulo de la misma
  221. //-----------------------------------------------------------------------------
  222.  
  223. PROCESS disparo_nave(x,y,angle);
  224.  
  225. PRIVATE
  226.     cont=20;                        // Contador de uso general
  227.  
  228. BEGIN
  229.     sound(sonido_fuego,100,100);    // Sonido de disparo
  230.     graph=2;                        // Selecciona el gráfico
  231.     REPEAT
  232.         x+=get_distx(angle,16);     // Calcula las coordenadas respecto a la nave
  233.         y+=get_disty(angle,16);
  234.  
  235.         // Comprueba si se ha salido de la pantalla y los arregla
  236.         IF (x<-16) x+=640+32; END
  237.         IF (y<-16) y+=480+32; END
  238.         IF (x>640+16) x-=640+32; END
  239.         IF (y>480+16) y-=480+32; END
  240.  
  241.         FRAME;
  242.     UNTIL (--cont==0)               // Avanza 20 pasos antes de desaparecer
  243. END
  244.  
  245.  
  246. //-----------------------------------------------------------------------------
  247. // Proceso para manejar los objetos de los asteroides
  248. // Entradas: Coordenadas y gráfico necesario (cambian de tamaño)
  249. //-----------------------------------------------------------------------------
  250.  
  251. PROCESS asteroide(x,y,graph);
  252.  
  253. PRIVATE
  254.     velocidad;                // Velocidad de los asteroides
  255.     id2=0;                    // Identificador de uso general
  256.     incr_ángulo;              // Velocidad de giro
  257.     ángulo2;                  // Dirección de avance
  258.  
  259. BEGIN
  260.     angle=ángulo2=rand(0,2*pi);     // Selecciona la dirección del asteroide
  261.     incr_ángulo=rand(-pi/32,pi/32); // Y la velocidad del giro
  262.     velocidad=graph+nivel;          // La velocidad depende de la fase del juego y del tamaño del asteroide
  263.  
  264.     LOOP
  265.  
  266.         // Comprueba si se ha chocado con un disparo
  267.         IF (id2=collision(TYPE disparo_nave))
  268.             puntuacion+=25*graph+(nivel-1)*25;  // Suma puntuación
  269.             signal(id2,s_kill);                 // Elimina el disparo
  270.             sound(sonido_explosion,30*(6-graph),33*graph);
  271.             IF (graph<5)                        // Si el asteroide es muy grande
  272.                 asteroide(x,y,graph+1);         // Crea dos más pequeños
  273.                 asteroide(x,y,graph+1);
  274.             END
  275.             IF (graph==3)                       // Si es el asteroide más grande
  276.                 asteroide(x,y,graph+1);         // Crea uno más (3 en total)
  277.             END
  278.             signal(ID,s_kill);                  // Elimina el asteroide actual
  279.         END
  280.  
  281.         // Comprueba si se ha chocado con la nave
  282.         IF (id2=collision(TYPE nave))
  283.             signal(id2,s_kill);             // Elimina el proceso de la nave
  284.             sound(sonido_explosion,200,100);// Hace sonido de destrucción
  285.             volumen=0;
  286.  
  287.             pieza(id2.x,id2.y,id2.angle,6); // Destruye la nave en piezas
  288.             pieza(id2.x,id2.y,id2.angle,7);
  289.             pieza(id2.x,id2.y,id2.angle,8);
  290.             pieza(id2.x,id2.y,id2.angle,9);
  291.         END
  292.  
  293.         x+=get_distx(ángulo2,velocidad);    // Mueve los asteroides
  294.         y+=get_disty(ángulo2,velocidad);
  295.  
  296.         // Comprueba que si se ha salido de pantalla y actualiza la posición en consecuencia
  297.         IF (x<-16)  x+=640+32;   END
  298.         IF (y<-16)  y+=480+32;   END
  299.         IF (x>640+16) x-=640+32; END
  300.         IF (y>480+16) y-=480+32; END
  301.  
  302.         angle+=incr_ángulo;                 // Gira el asteroide
  303.         FRAME;
  304.     END
  305. END
  306.  
  307.  
  308. //-----------------------------------------------------------------------------
  309. // Proceso para los objetos de las piezas cuando la nave ha sido destruida
  310. // Entradas: Coordenadas, ángulo de la nave, necesarios, y gráfico
  311. //-----------------------------------------------------------------------------
  312.  
  313.  
  314. PROCESS pieza(x,y,angle,graph);
  315.  
  316. PRIVATE
  317.     ángulo2;                        // Angulo aleatorio
  318.     incr_ángulo;                    // Velocidad de giro
  319.  
  320. BEGIN
  321.     ángulo2=rand(0,2*pi);           // Reinicia variables al azar para los ángulos
  322.     incr_ángulo=rand(-pi/32,pi/32);
  323.  
  324.     REPEAT
  325.         angle+=incr_ángulo;         // Gira los gráficos
  326.         x+=get_distx(ángulo2,2);    // Los mueve
  327.         y+=get_disty(ángulo2,2);
  328.         size-=2;                    // Y los re-escala (cada vez más pequeños)
  329.         FRAME;
  330.     UNTIL (size<=0)
  331.  
  332.     muerte=1;                       // Actualiza la variable para indicar que has muerto
  333. END
  334.  
  335. //-----------------------------------------------------------------------------
  336. // Proceso para el objeto que las naves del marcador de vidas
  337. // Entradas: Coordenadas del gráfico
  338. //-----------------------------------------------------------------------------
  339.  
  340. PROCESS nave_pequeña(x,y);
  341.  
  342. BEGIN
  343.     graph=1;                    // Elige el gráfico
  344.     size=75;                    // Hace que sea más pequeño que con la nave que juegas
  345.  
  346.     LOOP
  347.         angle+=pi/64;           // Gira el gráfico
  348.         FRAME;
  349.     END
  350.  
  351. END
  352.  
  353.  
  354. //-----------------------------------------------------------------------------
  355. // Proceso para el objeto del hiper-espacio, solo muestra el gráfico y el sonido
  356. // Entradas: Coordenadas del gráfico
  357. //-----------------------------------------------------------------------------
  358.  
  359. PROCESS hiperespacio(x,y);
  360.  
  361. BEGIN
  362.     sound(sonido_hiperespacio,180,400); // Realiza el sonido
  363.     graph=10;                           // Selecciona el gráfico
  364.     WHILE (size>0)                      // Repite hasta que desaparezca
  365.         size-=5;                        // Hace que el gráfico sea más pequeño
  366.         FRAME;
  367.     END
  368. END
  369.